# 数据分析题目解答(建议先赞后看，养成习惯 如果不赞，先拉出去枪毙两分钟 作者：小匠IT)
import pandas as pd

# 加载数据（请替换为实际文件路径）
file_path = r'data/17/绘制客户画像-原始数据 .xlsx'

# 读取客户信息表（表1），仅读取A到E列
df_customers = pd.read_excel(file_path, usecols="A:E", header=0)
df_customers.columns = ['客户昵称', '客户年龄', '客户来源地域', '客户来源端', '客户性别']

# 读取销售信息表（表2），仅读取J到K列
df_sales = pd.read_excel(file_path, usecols="J:K", header=0)
df_sales.columns = ['商品名称', '支付件数']

# 数据清洗：将客户年龄列中的非数字值设为NaN，并转换为整数类型
df_customers['客户年龄'] = pd.to_numeric(df_customers['客户年龄'], errors='coerce').astype('Int64')

# 定义年龄分组函数
def age_group(age):
    if pd.isna(age):
        return '未知'
    elif age <= 18:
        return '0-18'
    elif age <= 25:
        return '19-25'
    elif age <= 35:
        return '26-35'
    elif age <= 45:
        return '36-45'
    elif age <= 55:
        return '46-55'
    else:
        return '56+'

# 应用年龄分组函数
df_customers['年龄区间'] = df_customers['客户年龄'].apply(age_group)

# 数据清洗：将支付件数列中的非数字值设为NaN，并转换为整数类型
df_sales['支付件数'] = pd.to_numeric(df_sales['支付件数'], errors='coerce').astype('Int64')
df_sales.dropna(subset=['支付件数'], inplace=True)  # 删除支付件数为NaN的行

# 1. 客户来源最多的地域
most_common_region = df_customers['客户来源地域'].mode()[0]
print(f"1. 该网店客户来源最多的地域是 {most_common_region}。")

# 2. 男性和女性客户占比
gender_counts = df_customers['客户性别'].value_counts(normalize=True) * 100
male_percentage = round(gender_counts.get('男', 0), 2)
female_percentage = round(gender_counts.get('女', 0), 2)
print(f"2. 该网店男性客户占比是 {male_percentage:.2f}%，女性客户占比是 {female_percentage:.2f}%。")

# 3. 年龄区间消费群体数量最多
age_group_counts = df_customers['年龄区间'].value_counts()
most_common_age_group = age_group_counts.idxmax()
print(f"3. 根据分析结果可知，该网店哪个年龄区间的消费群体数量最多？{most_common_age_group}")

# 4. 年龄分组对应的分组下限从小到大依次是
age_groups_sorted = ['0-18', '19-25', '26-35', '36-45', '46-55', '56+', '未知']
age_group_lower_limits = [int(group.split('-')[0]) if '-' in group else -1 for group in age_groups_sorted]
print(f"4. 年龄分组对应的分组下限从小到大依次是 {', '.join(map(str, sorted(age_group_lower_limits)))}。")

# 5. 移动端和PC端客户占比
device_counts = df_customers['客户来源端'].value_counts(normalize=True) * 100
mobile_percentage = round(device_counts.get('移动端', 0), 2)
pc_percentage = round(device_counts.get('PC端', 0), 2)
print(f"5. 该网店移动端客户占比是 {mobile_percentage:.2f}%，PC端客户占比是 {pc_percentage:.2f}%。")

# 6. 客户偏好购买的产品排名
product_sales = df_sales.groupby('商品名称')['支付件数'].sum().sort_values(ascending=False)
top_product_1 = product_sales.index[0] if len(product_sales) > 0 else "无"
top_product_2 = product_sales.index[1] if len(product_sales) > 1 else "无"
print(f"6. 该网店客户偏好购买的产品，排名第一的产品是 {top_product_1}，排名第二的产品是 {top_product_2}。")